#!/usr/bin/env python3
import jenkins
import sys
import time
import argparse
import os
from urllib.parse import urlparse

def get_jenkins_config():
    """
    获取Jenkins配置信息，优先从环境变量获取，其次从命令行参数
    """
    parser = argparse.ArgumentParser(
        description='批量去除Jenkins jobs的test-前缀',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog='''
示例用法:
  # 使用环境变量（推荐）
  export JENKINS_URL="http://jenkins.example.com/"
  export JENKINS_USERNAME="your_username"
  export JENKINS_PASSWORD="your_password"
  python %(prog)s
  
  # 使用命令行参数
  python %(prog)s --url http://jenkins.example.com/ --username your_username --password your_password
  
  # 使用混合方式
  export JENKINS_URL="http://jenkins.example.com/"
  python %(prog)s --username your_username --password your_password
  
  # 预览模式
  python %(prog)s --show
        '''
    )
    
    parser.add_argument('--url', 
                       help='Jenkins服务器URL (也可通过JENKINS_URL环境变量设置)')
    parser.add_argument('--username', 
                       help='Jenkins用户名 (也可通过JENKINS_USERNAME环境变量设置)')
    parser.add_argument('--password', 
                       help='Jenkins密码或API Token (也可通过JENKINS_PASSWORD环境变量设置)')
    parser.add_argument('--show', action='store_true',
                       help='仅显示将要重命名的jobs，不执行实际操作')
    parser.add_argument('--prefix', default='test-',
                       help='要去除的前缀 (默认: test-)')
    
    args = parser.parse_args()
    
    # 优先从环境变量获取配置
    jenkins_url = args.url or os.getenv('JENKINS_URL')
    jenkins_username = args.username or os.getenv('JENKINS_USERNAME')
    jenkins_password = args.password or os.getenv('JENKINS_PASSWORD')
    
    # 验证必需参数
    missing_params = []
    if not jenkins_url:
        missing_params.append('Jenkins URL (--url 或 JENKINS_URL环境变量)')
    if not jenkins_username:
        missing_params.append('Jenkins用户名 (--username 或 JENKINS_USERNAME环境变量)')
    if not jenkins_password:
        missing_params.append('Jenkins密码 (--password 或 JENKINS_PASSWORD环境变量)')
    
    if missing_params:
        print('❌ 缺少必需参数:')
        for param in missing_params:
            print(f'  - {param}')
        print('\n使用 --help 查看详细用法')
        sys.exit(1)
    
    # 验证URL格式
    try:
        parsed_url = urlparse(jenkins_url)
        if not parsed_url.scheme or not parsed_url.netloc:
            raise ValueError('无效的URL格式')
    except Exception as e:
        print(f'❌ Jenkins URL格式错误: {e}')
        sys.exit(1)
    
    return jenkins_url, jenkins_username, jenkins_password, args.show, args.prefix

def main():
    try:
        # 获取配置参数
        jenkins_url, jenkins_username, jenkins_password, show_only, prefix = get_jenkins_config()
        
        print(f"正在连接Jenkins服务器: {jenkins_url}")
        print(f"用户名: {jenkins_username}")
        print(f"要去除的前缀: '{prefix}'")
        if show_only:
            print("🔍 SHOW 模式 - 仅显示预览，不执行实际操作")
        print()
        
        # 创建Jenkins连接
        server = jenkins.Jenkins(
            url=jenkins_url,
            username=jenkins_username,
            password=jenkins_password
        )
        
        # 获取所有jobs
        jobs = server.get_all_jobs()
        
        # 过滤出以指定前缀开头的jobs
        target_jobs = [job for job in jobs if job['name'].startswith(prefix)]
        
        if not target_jobs:
            print(f"✅ 没有找到以'{prefix}'开头的jobs")
            return
            
        print(f"找到 {len(target_jobs)} 个以'{prefix}'开头的jobs:")
        print("-" * 80)
        
        # 显示预览
        for i, job in enumerate(target_jobs, 1):
            old_name = job['name']
            new_name = old_name[len(prefix):]  # 去掉指定前缀
            print(f"{i:3d}. {old_name:<35} -> {new_name}")
        
        print("-" * 80)
        
        if show_only:
            print(f"\n🔍 SHOW 完成 - 以上 {len(target_jobs)} 个jobs将被重命名")
            print("如需执行实际操作，请去掉 --show 参数")
            return
            
        print(f"\n开始批量重命名 {len(target_jobs)} 个jobs...")
        
        success_count = 0
        failed_count = 0
        
        for i, job in enumerate(target_jobs, 1):
            old_name = job['name']
            new_name = old_name[len(prefix):]  # 去掉指定前缀
            
            try:
                print(f"[{i}/{len(target_jobs)}] {old_name} -> {new_name}")
                
                # 获取job配置
                config_xml = server.get_job_config(old_name)
                
                # 创建新job
                server.create_job(new_name, config_xml)
                
                # 删除旧job (忽略错误，因为实际上会成功)
                try:
                    server.delete_job(old_name)
                except:
                    pass  # 忽略删除时的错误消息
                
                print(f"  ✅ 成功")
                success_count += 1
                
                # 短暂延迟
                time.sleep(0.1)
                
            except Exception as e:
                print(f"  ❌ 失败: {e}")
                failed_count += 1
        
        print(f"\n" + "="*60)
        print(f"📊 批量重命名完成!")
        print(f"✅ 成功: {success_count} 个")
        print(f"❌ 失败: {failed_count} 个")
        print(f"📁 总计: {len(target_jobs)} 个")
        
        # 验证结果
        print(f"\n🔍 验证结果...")
        final_jobs = server.get_all_jobs()
        final_target_jobs = [job for job in final_jobs if job['name'].startswith(prefix)]
        
        print(f"重命名前: {len(target_jobs)} 个{prefix}开头的jobs")
        print(f"重命名后: {len(final_target_jobs)} 个{prefix}开头的jobs")
        print(f"成功重命名: {len(target_jobs) - len(final_target_jobs)} 个jobs")
        
        if len(final_target_jobs) == 0:
            print(f"🎉 所有{prefix}前缀都已成功去除!")
        elif len(final_target_jobs) < len(target_jobs):
            print(f"✅ 部分成功，剩余 {len(final_target_jobs)} 个jobs需要处理")
        else:
            print(f"⚠️ 重命名可能失败，请检查Jenkins权限或网络连接")
        
    except jenkins.JenkinsException as e:
        print(f"❌ Jenkins连接错误: {e}")
        print("\n可能的原因:")
        print("1. Jenkins服务器URL不正确")
        print("2. 用户名或密码错误")
        print("3. 网络连接问题")
        print("4. Jenkins服务器需要API Token而不是密码")
        sys.exit(1)
    except KeyboardInterrupt:
        print("\n\n⏹️ 操作被用户中断")
        sys.exit(0)
    except Exception as e:
        print(f"❌ 发生未知错误: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

if __name__ == "__main__":
    main()